'''
Created on Jun 12, 2012

@author: Nico
'''
import math
import clases as cs
import Parser

extremo_izquierdo = 7
extremo_derecho = 6
rango_modal = 10
i=0
# Genera clusters homogeneos, los entrega en un arreglo de clusters
def generarHomogeneos(array):
    output=[]
    global i
    for carrera in array:
        for semestre in carrera.semestres:
            for ramo in semestre.ramos:
                cluster = cs.Cluster(i)
                i=i+1
                hayOtro = False  
                if carrera in array:
                    array.remove(carrera)
                for carrer in array:                    
                    if carrer.nombre!=carrera.nombre:          
                        for semest in carrer.semestres:
                            for ram in semest.ramos:
                                if ram.nombre==ramo.nombre:
                                    hayOtro = True
                                    cluster.agregarRamo(ram)
                                    break
                if hayOtro:
                    cluster.agregarRamo(ramo)
                    hayOtro = False
                    output.append(cluster)
    #output=tuple(output)    #Como no se cambiaran mas, los deja como tupla.
    return output
                                
                
#table = Parser.ParseXLS('C:\Users\Nico\Desktop\Formato_Calendario.xls')
#clust = generarHomogeneos(table)     

def generarHeterogeneos(array, clust):
    ramos_homogeneos=[]
    global i
    for c in clust:
        for ramo in c.ramos:
            ramos_homogeneos.append(ramo.nombre)
    clusters={}
    for carrera in array:
        for semestre in carrera.semestres:
            for ramo in semestre.ramos:
                if ramo.nombre in ramos_homogeneos:
                    continue
                n_cluster = obtener_nHet(ramo.inscritos)
                id_cluster = str(n_cluster)
                if id_cluster not in clusters.keys():
                    clusters[id_cluster] = cs.Cluster(i)
                    i=i+1
                clusters[id_cluster].agregarRamo(ramo)
    output=[]
    for cl in clusters.values():
        output.append(cl)
    #output=tuple(output)
    return output


def obtener_nHet(n):
    if n <= extremo_izquierdo:
        return 0
    #Si no, se busca entre que valores modales se encuentra:
    v1 = int((n-extremo_izquierdo)/rango_modal)
    #Luego, el candidatos esta entre el cluster v1 y (v1+1)
    #Se comparan las areas...
    #El extremo 1 es el punto derecho del triangulo mas hacia la izquierda

    #Chequear si se solapan:
    
    extremo_1 = (v1*rango_modal+extremo_izquierdo+extremo_derecho)
    extremo_2 = ((v1+1)*rango_modal)
    if (n>extremo_2 and n<extremo_1):
        area_1 = (extremo_1-n)*(extremo_1-n)*math.tan(1/(extremo_1-n))/2
        area_2 = (n-extremo_2)*(n-extremo_2)*math.tan(1/(n-extremo_2))/2
        if(area_1 < area_2):
            return v1
        else:
            return (v1+1)
    else:
        if n<extremo_1:
            return v1
        else:
            return (v1+1)



